/**
 * 
 */
package twitter;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import twitter4j.IDs;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.User;

/**
 * @author Fernando
 * @author �ngel
 */
public class ListaTwitter {
	
	private Twitter funcionesAPI;
	private Set<Integer> listaUsuarios; //Conjunto de usuarios
	private User usuarioPrincipal; //Usuario a partir del cual recogemos la lista de amigos
	private HashMap<Integer, User> indiceEstados; //Te devuelve el estado actual del usuario que le indiques
	private HashMap<Integer, int[]> indiceListaAmigos; //Te devuelve un array con los id de todos sus amigos
	
	
	
	public ListaTwitter(String usuario){
		listaUsuarios = new HashSet<Integer>();
		indiceEstados = new HashMap<Integer, User>();
		indiceListaAmigos = new HashMap<Integer, int[]>();
		funcionesAPI  = new TwitterFactory().getInstance();
		try {
			usuarioPrincipal = funcionesAPI.showUser(usuario);
			indiceEstados.put(usuarioPrincipal.getId(), usuarioPrincipal);
			listaUsuarios.add(usuarioPrincipal.getId());
		} catch (Exception e) {
			System.err.println("No se ha podido acceder a la informacion de "+ usuario);
			e.printStackTrace();
		}
		
	}
	
	/**
	 * A partir del n�mero de iteraciones te devuelve una red con tantos niveles como iteraciones
	 * le indiques. S�lo se pueden realizar 150 peticiones por lo que con 2 peta.
	 */
	public void creaRedTwitter(int numIteraciones){
		Integer genteNivel[] = listaUsuarios.toArray(new Integer[0]);
		for (int i = 0; i < numIteraciones; i++) {
			ArrayList<Integer> siguienteNivel = new ArrayList<Integer>();
			for (int k = 0; k < genteNivel.length; k++) {
				try {
					IDs amigos = funcionesAPI.getFriendsIDs(genteNivel[k]);
					indiceListaAmigos.put(genteNivel[k], amigos.getIDs());
					for (int j = 0; j < amigos.getIDs().length; j++) {
						listaUsuarios.add(amigos.getIDs()[j]);
						indiceEstados.put(amigos.getIDs()[j], funcionesAPI.showUser(amigos.getIDs()[j]));
						siguienteNivel.add(amigos.getIDs()[j]);
					}
					
				} catch (Exception e) {
					// TODO
					System.err.println("No se ha podido acceder a los amigos de "+ genteNivel[k]);
					e.printStackTrace();
				}
			}
			genteNivel = siguienteNivel.toArray(new Integer[0]);
		}
	}
	
	
	/**
	 * Nos da los twits de todos los usuarios que esten en listaUsuarios
	 */
	public ArrayList<String> dameListaEstados(){
		ArrayList<String> listaEstados = new ArrayList<String>();
		Status estado;
		for (Integer id : listaUsuarios) {
			estado = indiceEstados.get(id).getStatus();
			try {
				listaEstados.add(estado.getText());
			} catch (Exception e) {
				
			}	
		}
		return listaEstados;
	}
	
	/**
	 * Todos los nombres de los usuarios almacenados
	 */
	public ArrayList<String> dameNombresUsuarios(){
		ArrayList<String> listaNombres = new ArrayList<String>();
		for (Integer id : listaUsuarios) {
			listaNombres.add(indiceEstados.get(id).getScreenName());
		}
		return listaNombres;
	}
	
	/**
	 * Nos da el nombre del usuario asignado a ese identificador
	 */
	public String dameNombreUsuario(int id){
		return indiceEstados.get(id).getScreenName();
	}
	
	/**
	 * Nos da el estado del usuario que corresponda con el identificador
	 */
	public String dameEstado(int id){
		User usuario = indiceEstados.get(id);
		Status estado;
		try {
			estado = usuario.getStatus();
			return estado.getText();
		} catch (Exception e) {
			return "";
		}
	}

	public Set<Integer> getListaUsuarios() {
		return listaUsuarios;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*ListaTwitter redTwitter = new ListaTwitter("ANGELOPELOTIS");
		redTwitter.creaRedTwitter(2);
		Set<Integer> listaUsuarios = redTwitter.getListaUsuarios();
		for (Integer usuario : listaUsuarios) {
			String nombreUsuario = redTwitter.dameNombreUsuario(usuario);
			String tweet = redTwitter.dameEstado(usuario);
			System.out.println( nombreUsuario + ": " + tweet);
		}*/ 
		
		ArrayList<String> twitts = new ArrayList<String>();
		//twitts.add("and when why what ");
		//twitts.add("This is just a very simple string to see if this works fine");
		//twitts.add("This is just a little simple chain to see how this works");
		//twitts.add("This is just a great string to see wether this works or not");
		//Set<String> clase1 = new HashSet<String>(twitts);
		
		/*twitts.add("My name is Fernando and I hate computers and dogs");
		twitts.add("My name is Angel and I love boys");
		twitts.add("Real Madrid is the best footbal team in the world");
		twitts.add("I hate facebook, the best is twitter");
		Set<String> clase2 = new HashSet<String>();
		twitts.add("I don't like rice but I love hamburgers and sandwiches");
		clase2.add("I don't like rice but I love hamburgers and sandwiches");
		twitts.add("I like pizza but I hate hamburgers");
		clase2.add("I like pizza but I hate hamburgers");
		twitts.add("I like italian pizza but I don't like salad with tomato");
		clase2.add("I like italian pizza but I don't like salad with tomato");
		twitts.add("I love hamburgers and rice but I hate pasta and spaguetti");
		clase2.add("I love hamburgers and rice but I hate pasta and spaguetti");*/
		
		//Set<Set<String>> cjtoReferencia = new HashSet<Set<String>>();
		//cjtoReferencia.add(clase1);
		//cjtoReferencia.add(clase2);
		//ArrayList<String> twitts;
		try {
			CSVReader lectorCSV = new CSVReader();
			twitts = lectorCSV.dameListaTweets();
			EspacioVectorial espaciovec = new EspacioVectorial(twitts);
			espaciovec.crearVectores();//����CAMBIAR EL NUMERO DE CLUSTERS!!!!!
			for (int i=1; i<=7; i++){
				System.out.println("Ejecución número "+i+":");
				ejecutaYEvalua(espaciovec, lectorCSV);
			}
			//HierarchicalClustering algoritmoJerarquico = new HierarchicalClustering(3, espaciovec.getTweetsProcesados());
			//algoritmoJerarquico.ejecutar();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private static void ejecutaYEvalua(EspacioVectorial espaciovec, CSVReader lectorCSV){
		KMeansClustering algoritmoKMeans = new KMeansClustering(3, espaciovec.getTweetsProcesados());
		algoritmoKMeans.ejecutar();
		Evaluation evaluacion = new Evaluation(lectorCSV.dameConjuntoClusters(), algoritmoKMeans.dameCjtoClusters());
		System.out.println("Evaluación recall: " + evaluacion.dameRecall());
		System.out.println("Evaluación accuracy: " + evaluacion.dameAccuracy());
		System.out.println("Evaluación precision: " + evaluacion.damePrecision());
		System.out.println("Evaluación f-mesure: " + evaluacion.dameFMeasure());
		double[] purezas = evaluacion.damePurezaClusters();
		for (int i = 0; i < purezas.length; i++) {
			System.out.println("Evaluación pureza cluster "+ (i+1) + ": " + purezas[i]);
		}
	}

}


